home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2000 #1
/
Amiga Plus CD - 2000 - No. 1.iso
/
c
/
lavd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-12-03
|
2KB
|
121 lines
#include <exec/exec.h>
#include <clib/exec_protos.h>
#include <clib/timer_protos.h>
#include <stdio.h>
#include <stdlib.h>
#include "lavd.h"
#include "timer.h"
struct ExecBase *ExecBase;
struct MsgPort *RequestPort = NULL;
static char PortName[] = "lavd";
main()
{
lavdMsg *Mesg;
int Stop = 0;
int L1 = 0, L2 = 0, L3 = 0;
struct timeval Start; /* Startup time. */
struct timeval Now; /* Current time. */
ExecBase = OpenLibrary("exec.library", 36L);
if (!timer_open()){
PutStr("Cannot open timer.\n");
goto exitmain;
}
if ((RequestPort = CreateMsgPort()) == NULL) {
PutStr("Cannot create message port.\n");
goto exitmain;
}
/*
* This is a critical section - if a lavd process is adding it's
* port, another cannot also do so at the same time, because
* neither will see the others port in the FindPort, and so two
* will end up running at once.
*/
Forbid();
if (FindPort(PortName)) {
Permit();
PutStr("Already running.\n");
goto exitmain;
}
RequestPort->mp_Node.ln_Name = "lavd";
RequestPort->mp_Node.ln_Pri = 0;
AddPort(RequestPort);
Permit();
GetSysTime(&Start);
while (! Stop){
ULONG Sig;
timer_start (250000); /* 1/4 of a second. */
Sig = Wait(1L<<RequestPort->mp_SigBit | 1L<<timer_port->mp_SigBit);
if (Sig & 1L<<RequestPort->mp_SigBit){
Forbid();
while ((Mesg = (lavdMsg *) GetMsg (RequestPort)) != NULL){
switch(Mesg->Class){
case LAV_STOP:
Stop = 1;
break;
case LAV_LOAD:
Mesg->L1 = L1 / 1000;
break;
case LAV_ALL:
GetSysTime (&Now);
Mesg->Uptime = Now.tv_secs - Start.tv_secs;
/* Fall though \/ */
case LAV_LOADS:
Mesg->L1 = L1 / 1000;
Mesg->L2 = L2 / 1000;
Mesg->L3 = L3 / 1000;
break;
case LAV_UP:
GetSysTime (&Now);
Mesg->Uptime = Now.tv_secs - Start.tv_secs;
break;
default:
break;
}
ReplyMsg(Mesg);
}
Permit();
}
if (Sig & 1L<<timer_port->mp_SigBit){
int Count = 0;
struct Node *node;
Disable();
for (node = ExecBase->TaskReady.lh_Head; node->ln_Succ; node = node->ln_Succ){
Count++;
}
Enable();
Count *= 100000;
L1 *= 120;
L1 += Count;
L1 /= 121;
L2 *= 1200;
L2 += Count;
L2 /= 1201;
L3 *= 3600;
L3 += Count;
L3 /= 3601;
}
}
RemPort(RequestPort);
exitmain:
timer_close();
if (RequestPort) {
DeleteMsgPort(RequestPort);
}
CloseLibrary(ExecBase);
exit(0);
}